package blue_bridge_cup_learning.差分;

import java.util.*;

// 小蓝最近获得了一个长度为 N 的字符串 S ，他对它爱不释手。
// 小桥为了考验小蓝对字符串的处理能力，决定给他提出一个挑战，她会进行 Q Q 次操作：
// 每次操作给定三个整数 l,r,k，将 S 的第 l 个字符到第 r 个字符都循环右移 k 次。小桥想让小蓝回答她在操作完成后 S 是多少？小蓝陷入了困境，于是请你帮帮他！
// 字符右移表示为按字母表进行移动，例如 a 右移 1 次变为 b 右移 2 次变为 d。特别地，z 右移 1 次变回为 a。
public class 字符迁移 {
    public static void main(String[] args) {
        String s = "abcde";
        char[] chars = s.toCharArray();
        // 将字符串变成数值数组
        int[] arr = new int[chars.length + 1];
        for (int i = 1; i < arr.length; i++) {
            arr[i] = (int) chars[i - 1];
        }
        System.out.println("数值数组：" + Arrays.toString(arr));
        // 计算差分数组
        int[] diff = new int[arr.length + 1];
        for (int i = 1; i < arr.length; i++) {
            diff[i] = arr[i] - arr[i - 1];
        }
        System.out.println("差分数组：" + Arrays.toString(diff));
        // 进行区间的操作
        int l = 1, r = 3, k = 2;
        diff[l] += k;
        diff[r + 1] -= k % 26;
        // 计算前缀和，还原数组
        for (int i = 1; i < arr.length; i++) {
            diff[i] = diff[i - 1] + diff[i];
        }
        System.out.println("前缀和数组：" + Arrays.toString(diff));
        // 将数值数组还原成字符串
        for (int i = 1; i < arr.length; i++) {
            chars[i - 1] = (char) (diff[i]);
        }
        System.out.println("字符串：" + Arrays.toString(chars));
    }
}
